import time


# print(time.time())

def timer(func):
    def wrapper():
        start_time = time.time()
        func()
        stop_time = time.time()
        print('函数运行了%s秒' % (stop_time - start_time))

    return wrapper


# 这个语法糖就是装饰器，用来装饰i_can_sleep()函数的
@timer
# 装饰器紧邻下一行的def 函数，就是被装饰函数，也就是传入装饰器的函数
def i_can_sleep():
    # 这里与普通的函数定义没什么不同，需要什么功能就用什么功能。
    time.sleep(3)


# start_time = time.time()

# 这一句的函数调用因为已经使用了语法糖，所以这一句等价于：timer(i_can_sleep)
i_can_sleep()


# i_can_sleep()的运行逻辑如下一样：
# timer(i_can_sleep())
# 然后就按timer里面的功能一行行执行
# start_time = time.time()
# i_can_sleep()
# stop_time = time.time()
# print('运行时间是%s秒' % (stop_time-start_time))

# 闭包和函数的区别：
# 首先闭包必须是函数内部的函数，闭包必须在内部函数引用外部函数中定义的值，返回值方面闭包函数必须返回嵌套函数。
#
# 装饰器和闭包的区别
# 装饰器就是闭包，但是装饰器强调不修改原函数的基础上增加功能，关注的是嵌套函数的外部函数
